package com.major.linkedlist;

class DoubleLinkHero {

    private HeroNode2 head = new HeroNode2(0, "", "");

    public HeroNode2 getHead() {
        return head;
    }

    public void setHead(HeroNode2 head) {
        this.head = head;
    }

    /**
     * 删除
     */
    void delete(int num) {
        if (head.next == null) {
            System.out.println("链表为空,");
            return;
        }

        HeroNode2 temp = head.next;
        boolean flag = false;
        // 遍历找到这个结点
        while (true) {
            if (temp == null) {
                break;  // 链表里没有这个编号
            }
            if (temp.num == num) {  // 找到
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.pre.next = temp.next;
            // 有可能空指针，最后一个结点
            if (temp.next != null) {
                temp.next.pre = temp.pre;
            }
        } else {
            System.out.println("没有找到编号为 " + num + " 的英雄");
        }
    }

    /**
     * 修改信息，根据num
     *
     * @param updateHero
     */
    void update(HeroNode2 updateHero) {
        // ***** 判断是否为空 *****
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        HeroNode2 temp = head.next;
        boolean flag = false;
        // ***** 遍历和具体操作分开写 **********************************************************
        // 遍历找到这个结点
        while (true) {
            if (temp == null) {
                break;  // 链表里没有这个编号
            }
            if (temp.num == updateHero.num) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.name = updateHero.name;
            temp.nickName = updateHero.nickName;
        } else {
            System.out.println("没有找到编号为 " + updateHero.num + " 的英雄");
        }
    }

    /**
     * 无顺序添加
     *
     * @param addHero
     */
    public void addHero(HeroNode2 addHero) {
        // 临时变量
        HeroNode2 temp = head;
        // 遍历找到链表最后一个节点
        while (true) {
            if (temp.next == null) {
                // 找到最后一个
                temp.next = addHero;
                addHero.pre = temp;
                break;
            }
            temp = temp.next;
        }
    }

    /**
     * 显示：遍历
     */
    void showHero() {
        // 判断是否为空
        if (head.next == null) {
            System.out.println("empty");
            return;
        }

        // 因为头节点不能动，所以需要temp
        HeroNode2 temp = head.next;
        while (true) {
            System.out.println(temp);
            if (temp.next == null) {
                break;
            }
            // 节点后移
            temp = temp.next;
        }

    }

    /**
     * 有顺序添加
     */
    void addHeroByOrder(HeroNode2 orderNode) {
        // 临时变量
        HeroNode2 temp = head;
        // 遍历找到要插入的位置
        // 插入节点的 num 小于下一个，
        while (true) {
            if (temp.next == null) {     // 空链表，跳出
                break;
            }
            if (temp.next.num > orderNode.num) { // 找到了要插入的位置
                break;
            }
            temp = temp.next;
        }
        if (orderNode.num == temp.num) {
            System.out.println("该位置有人了");
            return;
        }

        // 后链接
        if (temp.next != null) {
            temp.next.pre = orderNode;
            orderNode.next = temp.next;
        }
        // 前链接
        temp.next = orderNode;
        orderNode.pre = temp;


    }
}
